package cn.lirenyi.user.service.impl;

import cn.lirenyi.basic.exception.BusinessException;
import cn.lirenyi.basic.util.SmsContantsUtil;
import cn.lirenyi.basic.util.StrUtils;
import cn.lirenyi.user.constant.UserConstant;
import cn.lirenyi.user.domain.User;
import cn.lirenyi.user.mapper.UserMapper;
import cn.lirenyi.user.service.IVerifyCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.prefs.BackingStoreException;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void sendSmsCode(Map<String,String> map) {
        // 先要对手机号进行校验，非空和不能被注册
        // 查询手机号是否注册，对比数据库是否存在
        String phone = map.get("phone");
        String type = map.get("type");
        String businessKey ="";
        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(type)){
            throw new BusinessException("手机号不能为空123");
        }

        if ("register".equals(type)){   // 通过传入的参数判断是注册业务
            User user = userMapper.queryByPhone(phone);
            if (user != null){
                throw new BusinessException("该手机号码已被注册，请重新输入");
                // 判断手机号不能为空
            }else if (StringUtils.isEmpty(phone)){
                throw new BusinessException("手机号不能为空321");
            }
            businessKey = UserConstant.BUSINESS_REGISTER_PREFIX + phone;
        } else if ("binder".equals(type)){  // 通过传入的参数判断是绑定业务
            businessKey =UserConstant.BUSINESS_BINDER_PREFIX + phone;

        }
        if (!StringUtils.isEmpty(businessKey)){
            sendCode(businessKey);
        }

    }
    // 发送验证码的方法
    public void  sendCode(String businessKey){
        // 获取key
        Object codeTmp = redisTemplate.opsForValue().get(businessKey);
        String code = "";
        if (codeTmp != null){
            // 通过：截取成数组，拿到下标为1的元素
            String timeTmp = codeTmp.toString().split(":")[1];
            // 通过时间戳相减来判断时间是否小于1分钟
            if (System.currentTimeMillis()-Long.valueOf(timeTmp) <= 60000){
                // 小于1分钟就报异常，告诉前台请问重复获取
                throw new BusinessException("请勿重复获取验证码");
            } else {
                // 如果大于1分钟就重新使用开始的验证码并且重新设置3分钟有效期
                code = codeTmp.toString().split(":")[0];
            }
        } else {
            // 获取4位数的验证码
            code = StrUtils.getComplexRandomString(4);
        }
        redisTemplate.opsForValue().set(
                // 储存Redis，并且设置3分钟有效期
                businessKey,code+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        // 发短信
        // SmsContantsUtil.send(phone, "您的验证是："+code+";请在三分钟内使用");
        System.out.println("您的验证是：" + code + ";请在三分钟内使用");
    }



}
